package com.yigerende.web.admin;



import com.yigerende.model.Blog;
import com.yigerende.model.User;
import com.yigerende.service.BlogService;
import com.yigerende.service.TagService;
import com.yigerende.service.TypeService;
import com.yigerende.vo.BlogQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.servlet.http.HttpSession;
import javax.validation.Valid;

/*
* 博客管理页面
* */
@Controller
@RequestMapping("/admin")
public class BlogController {

//    直接定义好返回的页面，也可以哦，直接用常量就可以了
//    private static final String INPUT = "admin/blogs-input";
//    private static final String LIST = "admin/blogs";
//    private static final String REDIRECT_LIST = "redirect:/admin/blogs";


    @Autowired
    private BlogService blogService;

    @Autowired
    private TypeService typeService;

    @Autowired
    private TagService tagService;

    //后台获取博客列表

    @GetMapping("/blogs")
    public String blogs(@PageableDefault(size = 5,sort = {"updateTime"},direction = Sort.Direction.DESC)
            Pageable pageable, BlogQuery blog, Model model){
        //显示分类列表
        model.addAttribute("types",typeService.listType());//所有数据都传递给了types(给前端分类列表显示)
        model.addAttribute("page",blogService.listBlog(pageable,blog));
        return "admin/blogs";
    }


    //当点击搜索查询的时候，只刷新部分区域
    //这里要用post提交
    @PostMapping("/blogs/search")
    public String search(@PageableDefault(size = 5,sort = {"updateTime"},direction = Sort.Direction.DESC)
                                 Pageable pageable, BlogQuery blog, Model model){
        model.addAttribute("page",blogService.listBlog(pageable,blog));
        return "admin/blogs::blogList";//这个就是弹到blogs页面里面的blogList（刷新部分区域）,给要刷新的区域定义blogList
    }



    //新增页面
    @GetMapping("/blogs/input")
    public String Input(Model model){
        model.addAttribute("types",typeService.listType());//所有数据都传递给了types(给前端分类列表显示)
        model.addAttribute("tags",tagService.listTag());//所有数据都传递给了types(给前端分类列表显示)
        model.addAttribute("blog",new Blog());//初始化blog（因为新增和修改公用一个页面要进行初始化）
        return "admin/blogs-input";
    }



    /*新增页面的保存和发布按钮(这里使用新增和编辑公用一个方法)
     1.是个按钮点击提交表单用PostMapping
     2.当点击这两个按钮，要把表单数据传递到数据库，新增和编辑(括号里面用户传递过来的就是form表单里面name的值)，
                    这里直接用的Blog对象（要插入的数据都在对象里了）
     3.用session，因为在登陆哪里把用户保存到了session里面*/
    @PostMapping("/blogs1")
    public String post(Blog blog, RedirectAttributes attributes, HttpSession session){
//这个blog里面存在用户输入的标题，博客的内容，分类，标签，首图地址，博客描述，（推荐，转载声明，赞赏，评论）一个

        /**
         * 在前端模板form下面添加一个隐含域，提交id过来，如果有id过来JPA会自动修改
         * <input type="hidden" name="id" th:value="${id!=null?blog.id:''}">
         * */

        //拿到当前登陆的用户传递到了blog对象里面
        blog.setUser((User)session.getAttribute("user"));
        //通过传递另外一个模型对象的属性到另外一个模型里面
        //传递分类id给blog（先把用户选择的分类id传递给type查询全部的分类数据，又把type对象模型传递给blog）
        blog.setType(typeService.getType(blog.getType().getId()));
        blog.setTags(tagService.listTag(blog.getTagIds()));

        //把新增的对象blog插入数据库
        Blog b = blogService.saveBlog(blog);
        if(b == null){
            attributes.addFlashAttribute("message","对不起，操作失败!");
            return "redirect:/admin/blogs/input";
        }else{
            attributes.addFlashAttribute("message","恭喜操作成功");
            return "redirect:/admin/blogs";
        }

    }



    //点击编辑
    @GetMapping("/blogs/{id}/input")
    public String editInput(@PathVariable Long id, Model model){
        model.addAttribute("types",typeService.listType());//所有数据都传递给了types(给前端分类列表显示)
        model.addAttribute("tags",tagService.listTag());//所有数据都传递给了types(给前端分类列表显示)
        Blog blog = blogService.getBlog(id);
        blog.init();
        model.addAttribute("blog",blog);
        return "admin/blogs-input";
    }


    //删除页面
    //点击编辑按钮，传递id和Type放到model传递过去
    @GetMapping("/blogs/{id}/delete")
    public String delete(@PathVariable Long id,RedirectAttributes attributes){
        blogService.deleteBlog(id);
        attributes.addFlashAttribute("message","删除成功");
        return "redirect:/admin/blogs";
    }


}
